package sql_op

import (
	"errors"
	"fmt"
	"go_study/entity"
	"sync"

	"gorm.io/driver/postgres"
	"gorm.io/gorm"
	"gorm.io/gorm/schema"
)

type Orm struct {
	DB *gorm.DB
}

var o *Orm
var once sync.Once

func GetOrm() *Orm {
	once.Do(func() {
		o = &Orm{}
		o.GetDB()
	})
	return o
}

/*
名称：getDB
参数：
name 用户名
password 密码
ip IP地址
port 端口号
scheme 数据库
描述：获取数据库连接
*/
func (orm *Orm) GetDB() *Orm {
	//拼接mysql配置

	dsn := "host=127.0.0.1 port=5432 user=root dbname=study_go password=.Fjy.4526. sslmode=disable"

	//进行postgresql连接
	mydb, err := gorm.Open(postgres.Open(dsn), &gorm.Config{
		NamingStrategy: schema.NamingStrategy{
			TablePrefix:   "tbl_", // 表名前缀，`love`表为`t_love`
			SingularTable: true,   // 使用单数表名，启用该选项后，`love` 表将是`love`
		},
	})

	if err != nil { //连接失败
		panic("数据库连接出错")
	} else {
		//连接成功
		orm.DB = mydb

	}
	return orm

}

/*
名称：CreateTable
描述：创建表
*/
func (orm *Orm) CreateTable() {
	m := GetOrm().DB.Migrator()
	m.CreateTable(&entity.User{})
}

/*
名称：SelectByName
描述：根据用户名查找用户
*/
func (orm *Orm) SelectByName(name string) (entity.User, bool) {
	var user entity.User

	//根据用户名查询用户
	err := GetOrm().DB.Where("name = ?", name).First(&user).Error
	if errors.Is(err, gorm.ErrRecordNotFound) { //查询结果为空
		fmt.Println("未找到该用户")
		return user, false
	}
	fmt.Println("找到该用户")
	return user, true

	// if !errors.Is(err, gorm.ErrRecordNotFound) { //查询结果为空
	// 	fmt.Println("未找到该用户")
	// 	return user, false
	// }
	// fmt.Println("找到该用户")
	// return user, true
}

/*
名称：AddUser
描述：添加用户
*/
func (orm *Orm) AddUser(name string, password string) {
	//给结构体赋值
	user := entity.User{}
	user.SetName(name)
	user.SetPassword(password)

	//向数据库添加数据
	GetOrm().DB.Create(&user)
}
